{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "03896667",
   "metadata": {},
   "source": [
    "### 1 正规方程应用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "26bea970",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.linear_model import LinearRegression"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2c06e2b",
   "metadata": {},
   "source": [
    "#### 1.1 八元一次方程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "1d6ba2c4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  0,  14,   8,   0,   5,  -2,   9,  -3],\n",
       "       [ -4,  10,   6,   4, -14,  -2, -14,   8],\n",
       "       [ -1,  -6,   5, -12,   3,  -3,   2,  -2],\n",
       "       [  5,  -2,   3,  10,   5,  11,   4,  -8],\n",
       "       [-15, -15,  -8, -15,   7,  -4, -12,   2],\n",
       "       [ 11, -10,  -2,   4,   3,  -9,  -6,   7],\n",
       "       [-14,   0,   4,  -3,   5,  10,  13,   7],\n",
       "       [ -3,  -7,  -2,  -8,   0,  -6,  -5,  -9]])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([ 339, -114,   30,  126, -395,  -87,  422, -309])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 八元一次方程对应的X数据\n",
    "X = np.array([\n",
    "    [0, 14, 8, 0, 5, -2, 9, -3],\n",
    "    [-4, 10, 6, 4, -14, -2, -14, 8],\n",
    "    [-1, -6, 5, -12, 3, -3, 2, -2],\n",
    "    [5, -2, 3, 10, 5, 11, 4, -8],\n",
    "    [-15, -15, -8, -15, 7, -4, -12, 2],\n",
    "    [11, -10, -2, 4, 3, -9, -6, 7],\n",
    "    [-14, 0, 4, -3, 5, 10, 13, 7],\n",
    "    [-3, -7, -2, -8, 0, -6, -5, -9],\n",
    "])\n",
    "\n",
    "# 对应的y\n",
    "y = np.array([339, -114, 30, 126, -395, -87, 422, -309])\n",
    "\n",
    "display(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b7d20889",
   "metadata": {},
   "source": [
    "八元一次方程，唯一解，请问至少需要几个方程？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "20d46158",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.,  5., 15.,  3.,  8.,  4., 17., 12.])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# fit_intercept=False 不使用截距\n",
    "model = LinearRegression(fit_intercept=False)\n",
    "# 训练\n",
    "model.fit(X, y)\n",
    "display(model.coef_, model.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "668b288f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.,  5., 15.,  3.,  8.,  4., 17., 12.])"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 求逆矩阵\n",
    "# 标准答案\n",
    "np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f6e4d695",
   "metadata": {},
   "source": [
    "#### 1.2 八元一次方程添加截距"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "1e87c1e7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "截距是0： [ 339 -114   30  126 -395  -87  422 -309]\n",
      "增加了截距： [ 351 -102   42  138 -383  -75  434 -297]\n"
     ]
    }
   ],
   "source": [
    "# 设置 截距为12\n",
    "\n",
    "# 目标值进行移动，向上移动，加法运算\n",
    "print('截距是0：', y)\n",
    "y += 12\n",
    "print('增加了截距：', y)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "85eb51bf",
   "metadata": {},
   "source": [
    "$\n",
    "\\hat{y} = w_{1}X_{1} + w_{2}X_{2} + …… + w_{n}X_{n} + b\n",
    "$\n",
    "\n",
    "b也是一个未知变量，需要进行方程求解\n",
    "\n",
    "$\n",
    "\\hat{y} = w_{1}X_{1} + w_{2}X_{2} + …… + w_{n}X_{n} + w_{0} * 1\n",
    "$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "38e97df6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  0,  14,   8,   0,   5,  -2,   9,  -3,   1],\n",
       "       [ -4,  10,   6,   4, -14,  -2, -14,   8,   1],\n",
       "       [ -1,  -6,   5, -12,   3,  -3,   2,  -2,   1],\n",
       "       [  5,  -2,   3,  10,   5,  11,   4,  -8,   1],\n",
       "       [-15, -15,  -8, -15,   7,  -4, -12,   2,   1],\n",
       "       [ 11, -10,  -2,   4,   3,  -9,  -6,   7,   1],\n",
       "       [-14,   0,   4,  -3,   5,  10,  13,   7,   1],\n",
       "       [ -3,  -7,  -2,  -8,   0,  -6,  -5,  -9,   1]])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.concatenate([X, np.full(shape = (8, 1), fill_value=1)], axis=1)\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "ce843de4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  42.4453125 ,   -6.3515625 ,   83.359375  ,   -1.9921875 ,\n",
       "         10.9296875 ,   -5.953125  ,   -0.39648438,   -0.78515625,\n",
       "       -293.140625  ])"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "fd1426cd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.28902686,  3.99875919, 17.18947808,  4.3391324 ,  8.59756611,\n",
       "        2.82031444, 16.74961517, 11.58693282,  4.16860692])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = LinearRegression(fit_intercept=False)\n",
    "# 训练\n",
    "model.fit(X, y)\n",
    "display(model.coef_, model.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "7305a616",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(8, 9)"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 8代表8个方程，9代表计算的未知数\n",
    "# 8个9元一次方程，有多个解\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a29cebc0",
   "metadata": {},
   "source": [
    "#### 1.3 增加一个方程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "2cdafb74",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.,  5., 15.,  3.,  8.,  4., 17., 12.])"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w = np.array([ 1.,  5., 15.,  3.,  8.,  4., 17., 12.])\n",
    "w"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "f8fd4e9d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-12,  -6,  13,   9,   9,  -6,  11, -13])"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从-15到15\n",
    "X9 = np.random.randint(-15, 15, size=8)\n",
    "X9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "c6aa09bb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 351., -102.,   42.,  138., -383.,  -75.,  434., -297.,  271.])"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 上面的8个方程都有截距是12，第九个方程也一样\n",
    "# 126\n",
    "X9.dot(w)\n",
    "X9.dot(w) + 12\n",
    "\n",
    "y = np.concatenate([y, [X9.dot(w)+12]])\n",
    "\n",
    "# y = np.array([ 351., -102.,   42.,  138., -383.,  -75.,  434., -297.,  188.])\n",
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "24113138",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  0,  14,   8,   0,   5,  -2,   9,  -3,   1],\n",
       "       [ -4,  10,   6,   4, -14,  -2, -14,   8,   1],\n",
       "       [ -1,  -6,   5, -12,   3,  -3,   2,  -2,   1],\n",
       "       [  5,  -2,   3,  10,   5,  11,   4,  -8,   1],\n",
       "       [-15, -15,  -8, -15,   7,  -4, -12,   2,   1],\n",
       "       [ 11, -10,  -2,   4,   3,  -9,  -6,   7,   1],\n",
       "       [-14,   0,   4,  -3,   5,  10,  13,   7,   1],\n",
       "       [ -3,  -7,  -2,  -8,   0,  -6,  -5,  -9,   1]])"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "ad74949b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-12,  -6,  13,   9,   9,  -6,  11, -13,   1])"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将X9末尾添加系数1\n",
    "X9 = np.concatenate([X9, [1]])\n",
    "X9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "be5e7072",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  0,  14,   8,   0,   5,  -2,   9,  -3,   1],\n",
       "       [ -4,  10,   6,   4, -14,  -2, -14,   8,   1],\n",
       "       [ -1,  -6,   5, -12,   3,  -3,   2,  -2,   1],\n",
       "       [  5,  -2,   3,  10,   5,  11,   4,  -8,   1],\n",
       "       [-15, -15,  -8, -15,   7,  -4, -12,   2,   1],\n",
       "       [ 11, -10,  -2,   4,   3,  -9,  -6,   7,   1],\n",
       "       [-14,   0,   4,  -3,   5,  10,  13,   7,   1],\n",
       "       [ -3,  -7,  -2,  -8,   0,  -6,  -5,  -9,   1],\n",
       "       [-12,  -6,  13,   9,   9,  -6,  11, -13,   1]])"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将X9添加到X中\n",
    "X = np.concatenate([X, [X9]])\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "f9f67556",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.,  5., 15.,  3.,  8.,  4., 17., 12.])"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "9eab80a7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.,  5., 15.,  3.,  8.,  4., 17., 12., 12.])"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算添加X9后的解\n",
    "np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "e1f9a854",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.,  5., 15.,  3.,  8.,  4., 17., 12., 12.])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用sklearn计算结果\n",
    "model = LinearRegression(fit_intercept=False)\n",
    "model.fit(X, y)\n",
    "\n",
    "display(model.coef_, model.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "3a2ba220",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.,  5., 15.,  3.,  8.,  4., 17., 12.,  0.])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "12.000000000000071"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 四舍五入，截距12，最后的系数（权重）是0表示不重要\n",
    "model = LinearRegression(fit_intercept=True)\n",
    "model.fit(X, y)\n",
    "\n",
    "display(model.coef_, model.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "id": "6c78d482",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.,  5., 15.,  3.,  8.,  4., 17., 12.])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "12.000000000000078"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = LinearRegression(fit_intercept=True)\n",
    "# 去掉截距\n",
    "model.fit(X[:,:-1], y)\n",
    "\n",
    "display(model.coef_, model.intercept_)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "64ac4c14",
   "metadata": {},
   "source": [
    "### 2 正规方程计算\n",
    "\n",
    "#### 2.1 简单线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4f6af3da",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "一元一次方程真实的斜率和截距是： [4] [8]\n",
      "通过正规方程求解的斜率和截距是： [[3.86]\n",
      " [8.58]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1e65a742d90>]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 转化成矩阵，reshape\n",
    "X = np.linspace(0, 10, num=30).reshape(-1, 1)\n",
    "\n",
    "# 斜率和截距，随机生成\n",
    "w = np.random.randint(1, 5, size = 1)\n",
    "b = np.random.randint(1, 10, size = 1)\n",
    "\n",
    "# 根据一元一次方程计算目标值y，并加上“噪声”，数据有上下波动\n",
    "# 目标值y相当于真实值\n",
    "y = X * w + b + np.random.randn(30, 1)\n",
    "\n",
    "plt.scatter(X, y)\n",
    "\n",
    "# 重新构造X，b截距，相当于系数W0，前面统一乘以1\n",
    "X = np.concatenate([X, np.full(shape=(30, 1), fill_value=1)], axis=1)\n",
    "\n",
    "# 正规方程求解\n",
    "theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y).round(2)\n",
    "\n",
    "print('一元一次方程真实的斜率和截距是：', w, b)\n",
    "print('通过正规方程求解的斜率和截距是：', theta)\n",
    "\n",
    "# 根据求解的斜率和截距绘制线性回归线型图\n",
    "plt.plot(X[:,0], X.dot(theta), color='green')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eb740d56",
   "metadata": {},
   "source": [
    "#### 2.2 复杂多元一次方程（二元举例，图像）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "fb3c4eea",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "一元一次方程真实的斜率和截距是： [1 4 7]\n",
      "通过正规方程求解的斜率和截距是： [1.   4.   6.94]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<mpl_toolkits.mplot3d.art3d.Line3D at 0x1e65a83d0d0>]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 648x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "# 绘制三维图像\n",
    "from mpl_toolkits.mplot3d.axes3d import Axes3D\n",
    "\n",
    "# 转化成矩阵\n",
    "X1 = np.random.randint(-150, 150, size=(300, 1))\n",
    "X2 = np.random.randint(0, 300, size=(300, 1))\n",
    "\n",
    "# 斜率和截距，随机生成\n",
    "w = np.random.randint(1, 5, size = 2)\n",
    "b = np.random.randint(1, 10, size = 1)\n",
    "\n",
    "# 根据一元一次方程计算目标值y，并加上“噪声”，数据有上下波动\n",
    "# 目标值y相当于真实值\n",
    "y = X1 * w[0] + X2 * w[1] + b + np.random.randn(300, 1)\n",
    "\n",
    "fig = plt.figure(figsize=(9, 6))\n",
    "# ax = Axes3D(fig) # 出现红色的提示是因为这行代码被弃用了\n",
    "ax = plt.subplot(111, projection='3d')\n",
    "# 三维散点图\n",
    "ax.scatter(X1, X2, y)\n",
    "# 调整视角\n",
    "ax.view_init(elev=10, azim=-20)\n",
    "\n",
    "# 重新构造X，将X1、X2以及截距b，相当于系数W0，前面统一乘以1进行数据合并\n",
    "X = np.concatenate([X1, X2, np.full(shape=(300, 1), fill_value=1)], axis=1)\n",
    "w = np.concatenate([w, b])\n",
    "\n",
    "# 正规方程求解\n",
    "theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y).round(2)\n",
    "\n",
    "print('一元一次方程真实的斜率和截距是：', w)\n",
    "print('通过正规方程求解的斜率和截距是：', theta.reshape(-1))\n",
    "\n",
    "# 根据求解的斜率和截距绘制线性回归线型图\n",
    "x = np.linspace(-150, 150, 100)\n",
    "y = np.linspace(0, 300, 100)\n",
    "z = x * theta[0] + y * theta[1] + theta[2]\n",
    "ax.plot(x, y, z, color='red')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "187d1731",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
